/**
 * 
 */
package santeclair.referentiel.optique.referentiel.dao.impl;

import java.text.Normalizer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import santeclair.lunar.framework.dao.jpa.impl.FwkGenericJpaDAO;
import santeclair.referentiel.optique.config.Constant;
import santeclair.referentiel.optique.model.EnseigneOptique;
import santeclair.referentiel.optique.referentiel.dao.EnseigneOptiqueDAO;
import santeclair.referentiel.optique.referentiel.dto.EnseigneDistributeurDto;

/**
 * @author cquintin
 * 
 */
@Repository
public class EnseigneOptiqueDAOImpl extends FwkGenericJpaDAO<EnseigneOptique> implements EnseigneOptiqueDAO {
    private static final Logger LOGGER = LoggerFactory.getLogger(EnseigneOptiqueDAOImpl.class);

    @PersistenceContext(unitName = Constant.PERSISTENCE_UNIT_NAME)
    private EntityManager entityManager;

    /**
     * 
     */
    @Override
    public Map<Integer, List<String>> getDistributeurs() {
        String hql = "select new santeclair.referentiel.optique.referentiel.dto.EnseigneDistributeurDto(enseigne.idenseigne, distributeur.codeOpto10DistributeurOptique) from "
                        + EnseigneOptique.class.getName() + " enseigne join enseigne.distributeurOptiques distributeur";

        TypedQuery<EnseigneDistributeurDto> query = entityManager.createQuery(hql, EnseigneDistributeurDto.class);
        List<EnseigneDistributeurDto> enseignes = query.getResultList();
        LOGGER.info("Nombre d'enseignes {}", enseignes.size());
        Map<Integer, List<String>> mapEnseigneDistributeur = new HashMap<>();
        for (Iterator<EnseigneDistributeurDto> iterator = enseignes.iterator(); iterator.hasNext();) {
            EnseigneDistributeurDto enseigneDistributeurDto = iterator.next();
            List<String> lstDistributeur = mapEnseigneDistributeur.get(enseigneDistributeurDto.getIdenseigne());
            if (lstDistributeur == null) {
                lstDistributeur = new ArrayList<>();
            }
            lstDistributeur.add(enseigneDistributeurDto.getCodeOpt10Distributeur());
            mapEnseigneDistributeur.put(enseigneDistributeurDto.getIdenseigne(), lstDistributeur);
        }

        return mapEnseigneDistributeur;
    }

    @Override
    public Class<EnseigneOptique> getEntityClass() {
        return EnseigneOptique.class;
    }

    @Override
    public EntityManager getEntityManager() {
        return entityManager;
    }

    @Override
    public EnseigneOptique findByLibelleEnseigne(String paramValue) {

        String tempLibelle = paramValue;
        tempLibelle = Normalizer.normalize(tempLibelle, Normalizer.Form.NFD);
        tempLibelle = tempLibelle.replaceAll("[^\\p{ASCII}]", "");
        tempLibelle = tempLibelle.replaceAll("'", "");

        List<EnseigneOptique> libEnseigneList = findAll();

        EnseigneOptique libEnseigneToReturn = null;

        String tempLibelleCourant;

        for (EnseigneOptique libEnseigneCourant : libEnseigneList) {

            tempLibelleCourant = libEnseigneCourant.getEnseigne();
            tempLibelleCourant = Normalizer.normalize(tempLibelleCourant, Normalizer.Form.NFD);
            tempLibelleCourant = tempLibelleCourant.replaceAll("[^\\p{ASCII}]", "");
            tempLibelleCourant = tempLibelleCourant.replaceAll("'", "");

            if (tempLibelleCourant.equalsIgnoreCase(tempLibelle)) {

                libEnseigneToReturn = libEnseigneCourant;
                break;
            }
        }

        return libEnseigneToReturn;
    }

    @Override
    public EnseigneOptique findByIdWithDistributeurOptique(int id) {
        StringBuffer findByIdWithDistributeurOptique = new StringBuffer();
        findByIdWithDistributeurOptique.append("SELECT enseigneOptique FROM EnseigneOptique enseigneOptique ");
        findByIdWithDistributeurOptique.append("WHERE enseigneOptique.idenseigne = :idenseigne");

        TypedQuery<EnseigneOptique> query = entityManager.createQuery(findByIdWithDistributeurOptique.toString(), EnseigneOptique.class);
        query.setParameter("idenseigne", id);

        return query.getSingleResult();
    }

}
